trait Person {
    fn name(&self) -> String;
}

// Person 是 Student 的父 trait。
// 实现 Student 需要你也 impl 了 Person。
trait Student: Person {
    fn university(&self) -> String;
}

trait Programmer {
    fn fav_language(&self) -> String;
}

// CompSciStudent (computer science student，计算机科学的学生) 是 Programmer 和 Student 两者的子类。
// 实现 CompSciStudent 需要你同时 impl 了两个父 trait。
trait CompSciStudent: Programmer + Student {
    fn git_username(&self) -> String;
}

fn comp_sci_student_greeting(student: &dyn CompSciStudent) -> String {
    format!(
        "My name is {} and I attend {}. My favorite language is {}. My Git username is {}",
        student.name(),
        student.university(),
        student.fav_language(),
        student.git_username()
    )
}


struct Stud {
    name: String,
    // fn get_name(&self) -> String {
    //     self.name.clone()
    // }
}
impl Stud {
    fn get_name(&self) -> &str {
        &self.name
    }
}
// impl CompSciStudent for Stud {
//     fn git_username(&self) -> String {
//         "git_username".to_string()
//     // }
//     // fn fav_language(&self) -> String {
//     //     "Rust".to_string()
//     // }
//     // fn university(&self) -> String {
//     //     "University".to_string()
//     // }
//     // fn name(&self) -> String {
//     //     "Student".to_string()
//     // }
//     }
// }
// impl Person for Stud {
//     fn name(&self) -> String {
//         "Student".to_string()
//     }
// }
// impl Programmer for Stud {
//     fn fav_language(&self) -> String {
//         "Rust".to_string()
//     }
// }
// impl Student for Stud {
//     fn university(&self) -> String {
//         "University".to_string()
//     }
// }

fn main() {

    let student = Stud {};
    println!("{}", comp_sci_student_greeting(&student));

}
